/** ****************************************************************************
@defgroup CascadeBus CascadeBus
@ingroup BSP_External
@brief Button 板间级联总线驱动
@addtogroup CascadeBus
@{
*******************************************************************************/

#ifndef __I2C_BUS_H
#define __I2C_BUS_H


#define I2C_BUS1_RX_BUFFER_SIZE 32

class CI2cBus : public IPacketIf
{
    I2C_TypeDef*  _i2cPort;
	/// I2C 接口硬件地址
	u8 _i2cHardwareAddr;

    /// 用于响应处理的接收数据缓冲区
	ByteBuffer* _prxb;
    /// 协议处理接口
    IPacketProcessor* _rxproto;

public:
    /// @brief 初始化
    void init(ByteBuffer* prxb, I2C_TypeDef* i2cPort, u32 i2cSpeed, u8 i2cHardwareAddr);

    /// @brief 中断处理函数
    void irqHandler();

    /// 使能/禁用中断
    void enableIrq(bool sw);

public:
    /// 返回接口类型
    CommIfType ifType() { return CommIfType_I2C; }

    /// 返回 Rx 工作模式
    ShipCommRxWorkMode rxMode() { return ShipCommRxWorkMode_FrameMonitor; }

    /// @brief 使用指定硬件地址发送
    /// @return 实际发送的数据长度
    int send(u8 i2cHardwareAddr, void* data, u16 len);

    /// @brief 使用初始化时提供的接口硬件地址
    /// @return 实际发送的数据长度
    int send(void* data, u16 len) {
        return send(_i2cHardwareAddr, data, len);
    }

    int send(char* str) {
        return send(str, strlen(str));
    }

	/// @brief 开始异步接收监听
	inline void listenFor(IPacketProcessor *rxproto, bool enable) {
        _rxproto = rxproto;
        enableIrq(true);
    }

    /// 停止监听（数据帧和命令行都停止监听）
    void stopListen() {
        enableIrq(false);
    }
};


#endif  // __I2C_BUS_H
